package com.dao;

import com.entity.CommentReport;
import com.entity.GoodReport;

import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**  */
public interface ReportDao {
  /** 以下常量分别代表商品举报处理结果为不同意举报、未处理、提醒、警告、永久取消上架书籍权限 评论举报处理结果为提醒、警告、永久取消评论权限 */
  int UNTREATED = 0;

  int DISAGREE_GOOD_REPORT_RESULT = -1;

  int GOOD_UNQUALIFIED_REMIND_RESULT = 1;

  int GOOD_UNQUALIFIED_WARNING_RESULT = 2;

  int CANCEL_SELL_PERMISSION_RESULT = 3;

  int DISAGREE_COMMENT_REPORT_RESULT = -1;

  int COMMENT_UNQUALIFIED_REMIND_RESULT = 1;

  int COMMENT_UNQUALIFIED_WARNING_RESULT = 2;

  int CANCEL_COMMENT_PERMISSION_RESULT = 3;

  /**
   * 添加一条商品举报
   *
   * @param id 举报编号（UUID生成）
   * @param userId 举报者编号
   * @param goodId 商品编号
   * @param type 举报类型
   * @param reason 举报原因
   * @param pic1URL 举报截图1URL
   * @param pic2URL 举报截图2URL
   * @param pic3URL 举报截图3URL
   * @return 添加成功返回1，失败返回0
   */
  int insertAGoodReport(
      @Param("id") String id,
      @Param("userId") String userId,
      @Param("goodId") String goodId,
      @Param("type") String type,
      @Param("reason") String reason,
      @Param("pic1URL") String pic1URL,
      @Param("pic2URL") String pic2URL,
      @Param("pic3URL") String pic3URL);

  /**
   * 添加一条商品违规记录
   *
   * @param id 举报编号（UUID生成）
   * @param goodId 商品编号
   * @param type 举报类型
   * @param reason 举报原因
   * @param pic1URL 举报截图1URL
   * @param pic2URL 举报截图2URL
   * @param pic3URL 举报截图3URL
   * @param adminName 处理管理员名
   * @param result 处理结果
   * @param noticeSeller 通知卖家的模板
   * @return 添加成功条数（1或0）
   */
  int insertAUnqualifiedGoodRecord(
      @Param("id") String id,
      @Param("goodId") String goodId,
      @Param("type") String type,
      @Param("reason") String reason,
      @Param("pic1URL") String pic1URL,
      @Param("pic2URL") String pic2URL,
      @Param("pic3URL") String pic3URL,
      @Param("adminName") String adminName,
      @Param("result") int result,
      @Param("noticeSeller") String noticeSeller);

  /**
   * 添加一条评论举报
   *
   * @param id 举报编号（UUID生成）
   * @param userId 举报者编号
   * @param commentId 评论编号
   * @param type 举报类型
   * @param reason 举报原因
   * @return 插入成功或失败
   */
  int insertACommentReport(
      @Param("id") String id,
      @Param("userId") String userId,
      @Param("commentId") String commentId,
      @Param("type") String type,
      @Param("reason") String reason);

  /**
   * 添加一条评论违规记录
   *
   * @param id 记录编号
   * @param commentId 评论编号
   * @param type 违规类型
   * @param reason 违规原因
   * @param adminName 处理管理员名
   * @param result 处理结果
   * @param banDays 禁言天数
   * @param noticeCommentUser 通知评论者的模板
   * @return 添加成功条数（1或0）
   */
  int insertAUnqualifiedCommentRecord(
      @Param("id") String id,
      @Param("commentId") String commentId,
      @Param("type") String type,
      @Param("reason") String reason,
      @Param("adminName") String adminName,
      @Param("result") int result,
      @Param("banDays") int banDays,
      @Param("noticeCommentUser") String noticeCommentUser);

  /**
   * 获取管理员下架商品记录的数量
   *
   * @return 管理员下架商品记录的数量
   */
  int selectManagerPutOffGoodCount();

  /**
   * 获取管理员直接下架的商品
   *
   * @param start 开始索引
   * @param num 条数
   * @return 管理员直接下架的商品列表
   */
  List<Map<String, Object>> selectManagerPutOffGood(
      @Param("start") int start, @Param("num") int num);

  /**
   * 获取所有商品举报的数目
   *
   * @return 所有商品举报的数目、未处理数目
   */
  Map<String, Integer> selectAllGoodReportCount();

  /**
   * 获取所有商品举报信息
   *
   * @param start 页大小
   * @param num 页索引
   * @return 商品举报列表
   */
  List<Map<String, Object>> selectAllGoodReport(@Param("start") int start, @Param("num") int num);

  /**
   * 获取管理员下架评论记录的数量
   *
   * @return 管理员下架评论记录的数量
   */
  int selectManagerPutOffCommentCount();

  /**
   * 获取管理员直接下架的评论
   *
   * @param start 开始索引
   * @param num 条数
   * @return 管理员直接下架的评论列表
   */
  List<Map<String, Object>> selectManagerPutOffComment(
      @Param("start") int start, @Param("num") int num);

  /**
   * 获取所有评论举报的数目
   *
   * @return 所有商品举报的数目、未处理数目
   */
  Map<String, Integer> selectAllCommentReportCount();

  /**
   * 获取所有评论举报信息
   *
   * @param start 开始索引
   * @param num 数量
   * @return 评论举报列表
   */
  List<Map<String, Object>> selectAllCommentReport(
      @Param("start") int start, @Param("num") int num);

  /**
   * @param reportId
   * @return
   */
  GoodReport selectGoodReportById(@Param("reportId") String reportId);

  /**
   * 更新一条商品举报记录的处理状态
   *
   * @param adminName 处理管理员名
   * @param reportId 举报编号
   * @param result 处理结果
   * @param replyInformer 回复举报者的模板
   * @param noticeSeller 通知卖家的模板
   * @return 更新条数（0或1）
   */
  int updateGoodReportResult(
      @Param("adminName") String adminName,
      @Param("reportId") String reportId,
      @Param("result") int result,
      @Param("replyInformer") String replyInformer,
      @Param("noticeSeller") String noticeSeller);

  /**
   * 调用存贮过程，处理一条违规商品，下架违规商品
   *
   * @param reportId 商品举报编号
   * @param result 处理结果，1,2只下架商品并更新用户的商品违规次数，3下架用户所有的商品，并更新用户的卖书权限。
   */
  void dealUnqualifiedProduct(@Param("reportId") String reportId, @Param("result") int result);

  /**
   * 更新一条评论举报记录的处理状态
   *
   * @param adminName 处理管理员名
   * @param reportId 举报编号
   * @param result 处理结果
   * @param banDays 禁言天数
   * @param replyInformer 回复举报者的模板
   * @param noticeCommentUser 通知卖家的模板
   * @return 更新条数（0或1）
   */
  int updateCommentReportResult(
      @Param("adminName") String adminName,
      @Param("reportId") String reportId,
      @Param("result") int result,
      @Param("banDays") int banDays,
      @Param("replyInformer") String replyInformer,
      @Param("noticeCommentUser") String noticeCommentUser);

  /**
   * 调用存储过程处理一条评论举报
   *
   * @param reportId 举报编号
   * @param toTime 禁言至
   */
  void dealUnqualifiedComment(@Param("reportId") String reportId, @Param("toTime") Date toTime);

  /**
   * 根据编号获取一条评论举报信息
   *
   * @param reportId 举报编号
   * @return 评论举报信息
   */
  CommentReport selectCommentReportById(@Param("reportId") String reportId);
}
